package com.campuscarbooking.api.service;

import com.campuscarbooking.api.model.Reservation;
import com.campuscarbooking.api.model.BusSchedule;

import java.util.List;
import java.util.Set;

/**
 * 车位预约缓存服务
 * 负责班车座位分配、预约状态等强一致性缓存操作
 */
public interface SeatCacheService {

    /**
     * 获取班车可用座位列表
     * @param scheduleId 班车时刻表ID
     * @return 可用座位集合
     */
    Set<Integer> getAvailableSeats(Long scheduleId);
    
    /**
     * 占用班车座位
     * @param scheduleId 班车时刻表ID
     * @param seatNumber 座位号
     * @return 是否占用成功
     */
    boolean occupySeat(Long scheduleId, Integer seatNumber);
    
    /**
     * 释放班车座位
     * @param scheduleId 班车时刻表ID
     * @param seatNumber 座位号
     * @return 是否释放成功
     */
    boolean releaseSeat(Long scheduleId, Integer seatNumber);
    
    /**
     * 初始化班车座位
     * @param schedule 班车时刻表
     */
    void initializeSeats(BusSchedule schedule);
    
    /**
     * 获取用户在特定班车的预约情况
     * @param scheduleId 班车时刻表ID
     * @param userId 用户ID
     * @return 预约ID，如果没有则返回null
     */
    Long getUserReservation(Long scheduleId, Long userId);
    
    /**
     * 设置用户预约
     * @param reservation 预约信息
     */
    void setUserReservation(Reservation reservation);
    
    /**
     * 删除用户预约
     * @param scheduleId 班车时刻表ID
     * @param userId 用户ID
     */
    void removeUserReservation(Long scheduleId, Long userId);
    
    /**
     * 获取班车已预约座位数量
     * @param scheduleId 班车时刻表ID
     * @return 已预约座位数量
     */
    int getReservedSeatsCount(Long scheduleId);
    
    /**
     * 检查座位是否可用
     * @param scheduleId 班车时刻表ID
     * @param seatNumber 座位号
     * @return 是否可用
     */
    boolean isSeatAvailable(Long scheduleId, Integer seatNumber);
} 